package com.lzkj.baotouhousingfund.webview;

import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.coderc.library.view.ToastUtil;
import com.just.agentweb.AgentWeb;
import com.just.agentweb.AgentWebSettings;
import com.just.agentweb.ChromeClientCallbackManager;
import com.just.agentweb.DefaultWebClient;
import com.just.agentweb.DownLoadResultListener;
import com.just.agentweb.MiddleWareWebChromeBase;
import com.just.agentweb.MiddleWareWebClientBase;
import com.just.agentweb.PermissionInterceptor;
import com.just.agentweb.WebDefaultSettingsManager;
import com.lzkj.baotouhousingfund.R;
import com.lzkj.baotouhousingfund.http.api.ApiInterface;
import com.lzkj.baotouhousingfund.webview.client.MiddleWareChromeClient;
import com.lzkj.baotouhousingfund.webview.client.MiddlewareWebViewClient;
import com.lzkj.baotouhousingfund.webview.common.UIController;
import com.lzkj.baotouhousingfund.webview.widget.WebLayout;

/**
 * Created by cenxiaozhong on 2017/5/26.
 * <p>
 * source code  https://github.com/Justson/AgentWeb
 */

public class BaseWebActivity extends AppCompatActivity {


    protected AgentWeb     mAgentWeb;
    private   LinearLayout mLinearLayout;
    private   Toolbar      mToolbar;
    private   TextView     mTitleTextView;
    private   AlertDialog  mAlertDialog;

    private MiddleWareWebClientBase mWebClient;
    private MiddleWareWebChromeBase mMiddleWareWebChrome;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_web);


        mLinearLayout = (LinearLayout) this.findViewById(R.id.container);
        mToolbar = (Toolbar) this.findViewById(R.id.toolbar);
        mTitleTextView = (TextView) this.findViewById(R.id.toolbar_title);

        mToolbar.setTitleTextColor(Color.WHITE);
        mToolbar.setTitle(getToolbarTitle());
        mTitleTextView.setText(getWebTitle());
        this.setSupportActionBar(mToolbar);
        if (getSupportActionBar() != null) {
            // Enable the Up button
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                showDialog();
            }
        });


        long p = System.currentTimeMillis();

        mAgentWeb = AgentWeb.with(this)
                //传入AgentWeb的父控件。
                .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(ViewGroup
                        .LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))
                .useDefaultIndicator()//
                //设置进度条颜色与高度，-1为默认值，高度为2，单位为dp。
                .setIndicatorColorWithHeight(-1, 3)
                //设置 AgentWebSettings。
                .setAgentWebSettings(getSettings())
                //WebViewClient ， 与 WebView 使用一致 ，但是请勿获取WebView调用setWebViewClient(xx)方法了,
                // 会覆盖AgentWeb DefaultWebClient,同时相应的中间件也会失效。
                .setWebViewClient(mWebViewClient)
                //WebChromeClient
                .setWebChromeClient(mWebChromeClient)
                //权限拦截 2.0.0 加入。
                .setPermissionInterceptor(mPermissionInterceptor)
                .setWebLayout(new WebLayout(this))
                //标题回调。
                .setReceivedTitleCallback(mCallback)
                //严格模式 Android 4.2.2 以下会放弃注入对象 ，使用AgentWebView没影响。
                .setSecurityType(AgentWeb.SecurityType.strict)
                //下载回调
                .addDownLoadResultListener(mDownLoadResultListener)
                //自定义UI  AgentWeb3.0.0 加入。
                .setAgentWebUIController(new UIController(this))
                //参数1是错误显示的布局，参数2点击刷新控件ID -1表示点击整个布局都刷新， AgentWeb 3.0.0 加入。
                .setMainFrameErrorView(R.layout.agentweb_error_page, -1)
                //设置WebChromeClient中间件，支持多个WebChromeClient，AgentWeb 3.0.0 加入。
                .useMiddleWareWebChrome(getMiddleWareWebChrome())
                //设置WebViewClient中间件，支持多个WebViewClient， AgentWeb 3.0.0 加入。
                .useMiddleWareWebClient(getMiddleWareWebClient())
                .openParallelDownload()//打开并行下载 , 默认串行下载。
                //下载通知图标。
                .setNotifyIcon(R.drawable.ic_file_download_black_24dp)
                //打开其他页面时，弹窗质询用户前往其他应用 AgentWeb 3.0.0 加入。
                .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)
                //拦截找不到相关页面的Scheme AgentWeb 3.0.0 加入。
                .interceptUnkownScheme()
                //创建AgentWeb。
                .createAgentWeb()
                //设置 WebSettings。
                .ready()
                //WebView载入该url地址的页面并显示。
                .go(getUrl());

        //mAgentWeb.getLoader().loadUrl(getUrl());

//        long n = System.currentTimeMillis();
//        Log.i("Info", "init used time:" + (n - p));


    }


    public AgentWebSettings getSettings() {
        return WebDefaultSettingsManager.getInstance();
    }


    protected PermissionInterceptor mPermissionInterceptor = new PermissionInterceptor() {

        //AgentWeb 在触发某些敏感的 Action 时候会回调该方法， 比如定位触发 。
        //例如 https//:www.baidu.com 该 Url 需要定位权限， 返回false ，如果版本大于等于23 ， agentWeb 会动态申请权限 ，true
        // 该Url对应页面请求定位失败。
        //该方法是每次都会优先触发的 ， 开发者可以做一些敏感权限拦截 。
        @Override
        public boolean intercept(String url, String[] permissions, String action) {
//            Log.i(TAG, "url:" + url + "  permission:" + mGson.toJson(permissions) + " action:"
// + action);
            return false;
        }
    };


    /**
     * 下载文件完成后，回调文件的绝对路径 ，DownLoadResultListener只会在触发文件下载回调 ， 如果文件存在，并且完整 ，
     * AgentWeb则默认打开它。
     */
    protected DownLoadResultListener mDownLoadResultListener = new DownLoadResultListener() {
        //下载成功
        @Override
        public void success(String path) {
            ToastUtil.showShort(BaseWebActivity.this,"文件已下载至" + path);
        }

        //下载失败
        @Override
        public void error(String path, String resUrl, String cause, Throwable e) {
            ToastUtil.showShort(BaseWebActivity.this,"文件失败");
        }
    };


    //
    protected MiddleWareWebClientBase getMiddleWareWebClient() {
        return this.mWebClient = new MiddlewareWebViewClient();
    }

    protected MiddleWareWebChromeBase getMiddleWareWebChrome() {
        return this.mMiddleWareWebChrome = new MiddleWareChromeClient();
    }

    private WebViewClient   mWebViewClient   = new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            return super.shouldOverrideUrlLoading(view, request);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            //do you  work
            Log.i("Info", "BaseWebActivity onPageStarted");
        }
    };
    private WebChromeClient mWebChromeClient = new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            //do you work
//            Log.i("Info","progress:"+newProgress);
        }
    };

    public String getToolbarTitle() {
        return "";
    }

    public String getWebTitle() {
        return "";
    }

    public String getUrl() {

        return ApiInterface.HOST;
    }

    private ChromeClientCallbackManager.ReceivedTitleCallback mCallback = new
            ChromeClientCallbackManager.ReceivedTitleCallback() {
                @Override
                public void onReceivedTitle(WebView view, String title) {
                    if (mTitleTextView != null) {
                        mTitleTextView.setText(title);
                    }
                }
            };


    private void showDialog() {

        if (mAlertDialog == null) {
            mAlertDialog = new AlertDialog.Builder(this)
                    .setMessage("您确定要关闭该页面吗?")
                    .setNegativeButton("再逛逛", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (mAlertDialog != null) {
                                mAlertDialog.dismiss();
                            }
                        }
                    })//
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            if (mAlertDialog != null) {
                                mAlertDialog.dismiss();
                            }
                            BaseWebActivity.this.finish();
                        }
                    }).create();
        }
        mAlertDialog.show();

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (mAgentWeb.handleKeyEvent(keyCode, event)) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onPause() {
        mAgentWeb.getWebLifeCycle().onPause();
        super.onPause();

    }

    @Override
    protected void onResume() {
        mAgentWeb.getWebLifeCycle().onResume();
        super.onResume();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Log.i("Info", "result:" + requestCode + " result:" + resultCode);
        mAgentWeb.uploadFileResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //mAgentWeb.destroy();
        mAgentWeb.getWebLifeCycle().onDestroy();
    }
}
